package com.zjsru.plan2025.oneday;

/**
 * 2012. 数组美丽值求和
 *
 * @Author: cookLee
 * @Date: 2025-03-11
 */
public class SumOfBeauties {

    /**
     * 主
     * \
     * Input: nums = [1,2,3]
     * Output: 2
     * Explanation: For each index i in the range 1 <= i <= 1:
     * - The beauty of nums[1] equals 2.
     * \
     * Input: nums = [2,4,6,4]
     * Output: 1
     * Explanation: For each index i in the range 1 <= i <= 2:
     * - The beauty of nums[1] equals 1.
     * - The beauty of nums[2] equals 0.
     * \
     *
     * @param args args
     */
    public static void main(String[] args) {
        SumOfBeauties sumOfBeauties = new SumOfBeauties();
        int[] nums = new int[]{2, 4, 6, 4};
        System.out.println(sumOfBeauties.sumOfBeauties(nums));
    }

    /**
     * 对于取值为 2 的情况，我们总共需要两次遍历，第一次遍历判断某个值是否严格大于前面所有的值，第二次倒序遍历判断某个值是否严格小于后面所有的值。
     * 对于取值为 1 的情况，在第二次遍历时排除取值为 2 后判断即可。
     * 对于取值为 0 的情况，不需要特殊判断。
     *
     * @param nums nums
     * @return int
     */
    public int sumOfBeauties(int[] nums) {
        int len = nums.length;
        int[] state = new int[len];
        int pre = nums[0];
        for (int i = 1; i < len - 1; i++) {
            if (nums[i] > pre) {
                state[i] = 1;
                pre = nums[i];
            }
        }
        int suf = nums[len - 1];
        //总和
        int ans = 0;
        for (int i = len - 2; i > 0; i--) {
            if (nums[i] < suf && state[i] == 1) {
                ans += 2;
            } else if (nums[i - 1] < nums[i] && nums[i] < nums[i + 1]) {
                ans += 1;
            }
            suf = Math.min(suf, nums[i]);
        }
        return ans;
    }

}
